#define _CRT_SECURE_NO_WARNINGS 1

#include"contact.h"

////初始化通讯录函数   静态版本
//void init_contact(contact* p)
//{
//	p->sz = 0;
//	memset(p->data, 0, sizeof(p->data));
//}

//初始化通讯录函数    动态版本
void init_contact(contact* p)
{
	p->data = (peoinfo*)calloc(DEFAULT_SZ, sizeof(peoinfo));
	if (p->data == NULL)
	{
		perror("init_contact");
		return;
	}
	p->sz = 0;//初始化后默认是0
	p->capacity = DEFAULT_SZ;

	//加载文件（读文件）
	load_contact(p);
}
//是否需要增容函数
void check_capacity(contact* p)
{
	if (p->sz == p->capacity)
	{
		peoinfo* tmp = (peoinfo*)realloc(p->data, (p->capacity + INC_SZ) * sizeof(peoinfo));
		if (tmp == NULL)
		{
			perror("add_contact");
			printf("增容失败\n");
			return;
		}
		p->data = tmp;
		p->capacity += INC_SZ;
		printf("增容成功\n");
	}
}
//加载联系人函数
void load_contact(contact* p)
{
	FILE* pf = fopen("contact.dat", "r");
	if (pf == NULL)
	{
		perror("load_contact");
		return;
	}
	//读文件
	peoinfo tmp = { 0 };
	while (fread(&tmp, sizeof(peoinfo), 1, pf))
	{
		//是否需要增容
		check_capacity(p);
		p->data[p->sz] = tmp;
		p->sz++;
	}
	

	//关闭文件
	fclose(pf);
	pf = NULL;
}

////增加联系人函数      静态版本
//void add_contact(contact* p)
//{
//	if (p->sz == MAX)
//	{
//		printf("通讯录已满，无法添加");
//		return;
//	}
//	printf("请输入要添加人的姓名：");
//	scanf("%s", p->data[p->sz].name);
//	printf("请输入要添加人的性别：");
//	scanf("%s", p->data[p->sz].sex);
//	printf("请输入要添加人的年龄：");
//	scanf("%d", &p->data[p->sz].age);//只用年龄不是数组，要取地址
//	printf("请输入要添加人的电话：");
//	scanf("%s", p->data[p->sz].tele);
//	printf("请输入要添加人的住址：");
//	scanf("%s", p->data[p->sz].addr);
//
//	p->sz++;
//	printf("添加成功\n");
//}

//增加联系人函数      动态版本
void add_contact(contact* p)
{
	check_capacity(p);

	printf("请输入要添加人的姓名：");
	scanf("%s", p->data[p->sz].name);
	printf("请输入要添加人的性别：");
	scanf("%s", p->data[p->sz].sex);
	printf("请输入要添加人的年龄：");
	scanf("%d", &p->data[p->sz].age);//只用年龄不是数组，要取地址
	printf("请输入要添加人的电话：");
	scanf("%s", p->data[p->sz].tele);
	printf("请输入要添加人的住址：");
	scanf("%s", p->data[p->sz].addr);

	p->sz++;
	printf("添加成功\n");
}

//保存联系人函数
void save_contact(contact* p)
{
	FILE* pf = fopen("contact.dat", "w");
	if (pf == NULL)
	{
		perror("save_contact");
		return;
	}
	//写文件
	for (int i = 0;i < p->sz;i++)
	{
		fwrite(p->data + i, sizeof(peoinfo), 1, pf);
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
}

//销毁联系人函数
void destroy_contact(contact* p)
{
	free(p->data);
	p->data = NULL;
	p->sz = 0;
	p->capacity = 0;
}

//打印联系人函数
void print_contact(const contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空，无法打印\n");
	}
	else
	{
		printf("%-10s  %-10s  %-10s  %-15s  %-10s\n", "姓名", "性别", "年龄", "电话", "住址");
		for (int i = 0;i < p->sz;i++)
		{
			printf("%-10s  %-10s  %-10d  %-15s  %-10s\n",
				p->data[i].name,
				p->data[i].sex,
				p->data[i].age,
				p->data[i].tele,
				p->data[i].addr);
		}
	}
}

//查找函数的一部分，只放在这就行
static int find_by_name(contact* p, char name[])
{
	for (int i = 0;i < p->sz;i++)
	{
		if (strcmp(p->data[i].name,name)==0)
		{
			return i;
		}
	}
	return -1;
}

//删除联系人函数
void del_contact(contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空，无法删除\n");
	}
	else
	{
		char name[MAX_NAME] = { 0 };
		printf("请输入要删除人的名字：");
		scanf("%s", name);
		int pos = find_by_name(p, name);
		if (pos == -1)
		{
			printf("要删除的人不存在\n");
		}
		else
		{
			for (int i = pos;i < p->sz - 1;i++)
			{
				p->data[i] = p->data[i + 1];
			}
			p->sz--;
			printf("删除成功\n");
		}
	}
}

//查找联系人函数
void find_contact(const contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空，无法查找\n");
	}
	else
	{
		char name[MAX_NAME] = { 0 };
		printf("请输入要查找人的名字：");
		scanf("%s", name);
		int pos = find_by_name(p, name);
		if (pos == -1)
		{
			printf("要查找的人不存在\n");
		}
		else
		{
			printf("%-10s  %-10s  %-10s  %-15s  %-10s\n", "姓名", "性别", "年龄", "电话", "住址");
			printf("%-10s  %-10s  %-10d  %-15s  %-10s\n",
				p->data[pos].name,
				p->data[pos].sex,
				p->data[pos].age,
				p->data[pos].tele,
				p->data[pos].addr);
		}
	}
}

//修改联系人函数
void modify_contact(contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空，无法查找\n");
	}
	else
	{
		char name[MAX_NAME] = { 0 };
		printf("请输入要修改人的姓名：");
		scanf("%s", name);
		int pos = find_by_name(p, name);
		if (pos == -1)
		{
			printf("要修改的人不存在\n");
		}
		else
		{
			printf("以下是输入要修改人的新信息：\n");
			printf("请输入姓名：");
			scanf("%s", p->data[pos].name);
			printf("请输入性别：");
			scanf("%s", p->data[pos].sex);
			printf("请输入年龄：");
			scanf("%d", &p->data[pos].age);
			printf("请输入电话：");
			scanf("%s", p->data[pos].tele);
			printf("请输入住址：");
			scanf("%s", p->data[pos].addr);

			printf("修改成功\n");
		}
	}
}

//排序联系人函数

int cmp(void* e1, void* e2)
{
	return strcmp(((peoinfo*)e1)->name, ((peoinfo*)e2)->name);
}
void sort_contact(contact* p)
{
	if (p->sz == 0)
	{
		printf("通讯录为空，无法排序\n");
	}
	else
	{
		qsort(p->data, p->sz, sizeof(peoinfo), cmp);
		printf("按照姓名排序成功\n");
	}
}

void sort_contact2(contact* p)//冒泡，比较麻烦，就用qsort了
{
	if (p->sz == 0)
	{
		printf("通讯录为空，无法排序\n");
	}
	else
	{
		for (int i = 0; i < p->sz; i++)
		{
			for (int j = 0; j < p->sz - i - 1; j++)
			{
				if (strcmp((p->data[j].name), (p->data[j + 1].name)) > 0)
				{
					peoinfo data = p->data[j];
					p->data[j] = p->data[j + 1];
					p->data[j + 1] = data;
				}
			}
		}
		printf("按照姓名排序成功\n");
	}
}